"""
chat room
env python3.6
socket udp & fork

"""


from socket import *
import os,sys


"""
全局变量:很多封装模块都要用或者有一定的固定含义
"""
# 服务器地址
ADDR = ('0.0.0.0',8888)

# 存储用户{name:address}
user = {}


def do_login(sockfd, name, addr):
	if name in user or '管理员' in name:
		sockfd.sendto(b'This user alrealy login\n',addr)
		return
	sockfd.sendto(b'OK',addr) # 可以进入聊天室

	# 通知其它客户端
	msg = "%s is come\n"%name
	for i in user:
		sockfd.sendto(msg.encode(),user[i])
	user[name] = addr # 插入字典



# 聊天
def do_chat(sockfd,name,text):
	msg = "%s: %s\n"%(name,text)
	for i in user:
		# 刨除本人
		if i != name:
			sockfd.sendto(msg.encode(),user[i])

# 退出
def do_quit(sockfd,name):
	msg = "%s exit"%name
	for i in user:
		if i == name:
			sockfd.sendto(b"EXIT",user[i])
		sockfd.sendto(msg.encode(),user[i])
	del user[name] # 删除用户

# 处理请求
def do_request(sockfd):
	while True:
		data,addr = sockfd.recvfrom(1024)
		tmp = data.decode().split(' ') # 拆分请求
		# 根据不同的请求类型执行不同的事情
		if tmp[0] == 'L':
			do_login(sockfd,tmp[1],addr)
		elif tmp[0] == 'C':
			text = ' '.join(tmp[2:])
			do_chat(sockfd,tmp[1],text)
		elif tmp[0] == 'Q':
			do_quit(sockfd,tmp[1])

# 搭建网络
def main():
	# UDP服务器
	sockfd = socket(AF_INET, SOCK_DGRAM)
	sockfd.bind(ADDR)
	
	pid = os.fork()
	if pid == 0: # 子进程处理管理员消息
		while True:
			msg = input("管理员消息:")
			msg = "C 管理员 " + msg
			sockfd.sendto(msg.encode(),ADDR)
	# 请求处理
	do_request(sockfd)

if __name__ == "__main__":
	main()
